home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / russell / russell.lha / examples / points.r < prev    next >
Text File  |  1989-12-29  |  2KB  |  54 lines

  1. (* This is a simple illustration of a parametrized data type. *)
  2. (* The problem was suggested by Scott Danforth.               *)
  3. (* It turned out to be a surprisingly useful test of the      *)
  4. (* compiler.                                                  *)
  5. let
  6.     (* Point data type, with addition operation *)
  7.     point == prod {
  8.         xpos, ypos: val Float
  9.          } with p {
  10.         + == func [x, y: val p] {
  11.             p$Mk[xpos[x] + xpos[y], ypos[x] + ypos[y]]
  12.              }
  13.          } export {Mk; +; xpos; ypos};
  14.  
  15.     (* Poor square root routine.  Actually it's now built in, but this *)
  16.     (* is more interesting.                                            *)
  17.     sqrt == func [x: val Float] {
  18.         let
  19.             xn == Float$New[];
  20.             xnp1 == Float$New[];
  21.             eps == 0.0001;
  22.             abs == func[x:val Float] {
  23.                 if x > 0.0 ==> x # else ==> -x fi
  24.                }
  25.         in
  26.             xn := x;
  27.             do abs((xnp1 := xn/2.0 + x/(2.0*xn)) - xn) > eps ==>
  28.             xn := xnp1;
  29.             od;
  30.             xn
  31.         ni
  32.         };
  33.  
  34.     (* Line data type, parametrized with respect to the type of points *)
  35.     line == func [p: type P {xpos, ypos: func[val P] val Float}] {
  36.         prod {
  37.             x, y: val p; (* end points *)
  38.         } with L {
  39.             length == func[z: val L] {
  40.                 let
  41.                     xdiff == xpos[x[z]] - xpos[y[z]];
  42.                     ydiff == ypos[x[z]] - ypos[y[z]]
  43.                 in
  44.                     sqrt[xdiff * xdiff + ydiff * ydiff]
  45.                 ni
  46.                   }
  47.         } export {Mk; length}
  48.         };
  49.  
  50. in use point, line[point] in
  51.     (* length of line from (1,1) to (3,3) *)
  52.     put[length[Mk[Mk[1.0, 1.0], Mk[3.0, 3.0]]]]; put "\n";
  53. ni ni
  54.